package com.qfedu.mtl.util.handler.impl;

import com.qfedu.mtl.util.DBUtil;
import com.qfedu.mtl.util.handler.ResultSetHandler;

import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
//具体实现转换功能的转换器: 把查询结果转换成 List<Bean>
public class BeanListHandler<T> implements ResultSetHandler<List<T>> {
    private Class<T> cls;
    private Boolean openCamel;
    public BeanListHandler(Class<T> cls,Boolean openCamel) {
        this.cls = cls;
        this.openCamel =  openCamel;
    }
    @Override
    public List<T> mapperTo(ResultSet rs) {
        //定义被返回的对象集合
        List<T> list = new ArrayList<>();
        //定义要给列名集合
        List<String> columns = new ArrayList<>();
        try {
            // 我需要知道结果集合中有哪些信息(发现列名)
            ResultSetMetaData metaData = rs.getMetaData();
            int columnCount = metaData.getColumnCount();
            for (int i = 1; i <= columnCount; i++) {
                String columnLabel = metaData.getColumnLabel(i);
                //保存这些列名
                columns.add(columnLabel);
            }
            // 如果有数据
            while ( rs.next() ){
                // 创建对象为属性赋值
                T  obj = cls.newInstance();
                // 根据列名获取数据
                for (String column : columns) {
                    Object value = rs.getObject(column);
                    //根据列名查找同名属性
                    Field fd = null;
                    try {
                        if( openCamel ){
                            //把把列名转成驼峰找属性
                            column = DBUtil.underLine2Camel(column);
                        }
                        fd = cls.getDeclaredField(column);
                        //访问权限
                        fd.setAccessible(true);
                        //把这列的值赋值给同名属性  // Double  BigDecimal
                        if( value!=null && value.getClass()== BigDecimal.class){
                            BigDecimal v =   (BigDecimal)value;
                            fd.set(obj,v.doubleValue() );
                        }else{
                            fd.set(obj,value);
                        }
                    } catch (NoSuchFieldException e) {

                    }

                }
                //这个对象添加到集合
                list.add(obj);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return list;
    }
}
